﻿//IRemoteStorage.cs
//Copyright (c) 2013 StockSharp LLC, all rights reserved.
//This code module is part of StockSharp library.
//This code is licensed under the GNU GENERAL PUBLIC LICENSE Version 3.
//See the file License.txt for the license details.
//More info on: http://stocksharp.com

namespace StockSharp.Algo.History.Hydra
{
	using System;
	using System.IO;
	using System.ServiceModel;

	using StockSharp.Algo.Candles;
	using StockSharp.BusinessEntities;

	/// <summary>
	/// Интерфейс, описывающий внешнее хранилище маркет-данных, доступ к которому организован через сетевое соединение WCF (подробнее, <see cref="System.ServiceModel"/>).
	/// </summary>
	[ServiceContract(Namespace = "http://stocksharp.com/hydraserver")]
	public interface IRemoteStorage
	{
		/// <summary>
		/// Произвести вхов в систему.
		/// </summary>
		/// <param name="login">Логин.</param>
		/// <param name="password">Пароль.</param>
		/// <returns>Идентификатор сессии.</returns>
		[OperationContract]
		Guid Login(string login, string password);

		/// <summary>
		/// Выйти из системы.
		/// </summary>
		/// <param name="sessionId">Идентификатор сессии.</param>
		[OperationContract]
		void Logout(Guid sessionId);

		/// <summary>
		/// Получить все идентификаторы инструментов.
		/// </summary>
		/// <param name="sessionId">Идентификатор сессии.</param>
		/// <returns>Все идентификаторы инструментов.</returns>
		[OperationContract]
		string[] GetAllSecurityIds(Guid sessionId);

		/// <summary>
		/// Получить инструменты.
		/// </summary>
		/// <param name="sessionId">Идентификатор сессии.</param>
		/// <param name="securityIds">Идентификаторы инструментов.</param>
		/// <returns>Инструменты.</returns>
		[OperationContract]
		Security[] GetSecurities(Guid sessionId, string[] securityIds);

		/// <summary>
		/// Получить все даты, для которых записаны маркет-данные.
		/// </summary>
		/// <param name="sessionId">Идентификатор сессии.</param>
		/// <param name="securityId">Идентификатор инструмента.</param>
		/// <param name="dataType">Тип маркет-данных.</param>
		/// <param name="arg">Параметр, ассоциированный с типом <paramref name="dataType"/>. Например, <see cref="Candle.Arg"/>.</param>
		/// <returns>Диапазон доступных дат.</returns>
		[OperationContract]
		DateTime[] GetDates(Guid sessionId, string securityId, string dataType, object arg);

		/// <summary>
		/// Получить все типы и параметры свечек, для которых записаны маркет-данные.
		/// </summary>
		/// <param name="sessionId">Идентификатор сессии.</param>
		/// <param name="securityId">Идентификатор инструмента.</param>
		/// <returns>Все типы и параметры свечек.</returns>
		[OperationContract]
		Tuple<Type, object[]>[] GetCandleTypes(Guid sessionId, string securityId);

		/// <summary>
		/// Сохранить маркет-данные в формате хранилища StockSharp.
		/// </summary>
		/// <param name="sessionId">Идентификатор сессии.</param>
		/// <param name="securityId">Идентификатор инструмента.</param>
		/// <param name="dataType">Тип маркет-данных.</param>
		/// <param name="arg">Параметр, ассоциированный с типом <paramref name="dataType"/>. Например, <see cref="Candle.Arg"/>.</param>
		/// <param name="date">Дата, для которой необходимо сохранить маркет-данные.</param>
		/// <param name="data">Маркет-данные в формате хранилища StockSharp.</param>
		[OperationContract]
		void Save(Guid sessionId, string securityId, string dataType, object arg, DateTime date, byte[] data);

		/// <summary>
		/// Удалить маркет-данные из хранилища за указанную дату.
		/// </summary>
		/// <param name="sessionId">Идентификатор сессии.</param>
		/// <param name="securityId">Идентификатор инструмента.</param>
		/// <param name="dataType">Тип маркет-данных.</param>
		/// <param name="arg">Параметр, ассоциированный с типом <paramref name="dataType"/>. Например, <see cref="Candle.Arg"/>.</param>
		/// <param name="date">Дата, для которой необходимо удалить маркет-данные.</param>
		[OperationContract]
		void Delete(Guid sessionId, string securityId, string dataType, object arg, DateTime date);

		/// <summary>
		/// Загрузить маркет-данные в формате хранилища StockSharp.
		/// </summary>
		/// <param name="sessionId">Идентификатор сессии.</param>
		/// <param name="securityId">Идентификатор инструмента.</param>
		/// <param name="dataType">Тип маркет-данных.</param>
		/// <param name="arg">Параметр, ассоциированный с типом <paramref name="dataType"/>. Например, <see cref="Candle.Arg"/>.</param>
		/// <param name="date">Дата, для которой необходимо загрузить маркет-данные.</param>
		/// <returns>Маркет-данные в формате хранилища StockSharp. Если данных не существует, то будет возвращено null.</returns>
		[OperationContract]
		byte[] Load(Guid sessionId, string securityId, string dataType, object arg, DateTime date);

		/// <summary>
		/// Загрузить маркет-данные в формате хранилища StockSharp.
		/// </summary>
		/// <param name="sessionId">Идентификатор сессии.</param>
		/// <param name="securityId">Идентификатор инструмента.</param>
		/// <param name="dataType">Тип маркет-данных.</param>
		/// <param name="arg">Параметр, ассоциированный с типом <paramref name="dataType"/>. Например, <see cref="Candle.Arg"/>.</param>
		/// <param name="date">Дата, для которой необходимо загрузить маркет-данные.</param>
		/// <returns>Маркет-данные в формате хранилища StockSharp. Если данных не существует, то будет возвращено <see cref="Stream.Null"/>.</returns>
		[OperationContract]
		Stream LoadStream(Guid sessionId, string securityId, string dataType, object arg, DateTime date);

		/// <summary>
		/// Удалить кэш-файлы, хранящие в себе информацию о доступных диапазонах времени.
		/// </summary>
		/// <param name="sessionId">Идентификатор сессии.</param>
		/// <param name="securityId">Идентификатор инструмента.</param>
		/// <param name="dataType">Тип маркет-данных.</param>
		/// <param name="arg">Параметр, ассоциированный с типом <paramref name="dataType"/>. Например, <see cref="Candle.Arg"/>.</param>
		void ClearDatesCache(Guid sessionId, string securityId, string dataType, object arg);
	}
}